class Solution {
public:
    //dp[i][j]为以i位置开始，j位置结束的字串是否是一个回文串（0/1）
    string longestPalindrome(string s) {
        string ret;
        int n = s.size();
        vector<vector<char>> dp(n, vector<char>(n));    //不能用int，否则超出空间限制

        for (int j = 0; j < n; j++)
        {
            for (int i = j; i >= 0; i--)
            {
                if (i == j)
                    dp[i][j] = 1;
                else
                {
                    if (s[i] == s[j] && (j - i == 1 || dp[i + 1][j - 1] == 1))
                        dp[i][j] = 1;
                }

                if (dp[i][j] == 1)
                    ret = ret.size() >= (j - i + 1) ? ret : s.substr(i, j - i + 1);
            }
        }
        return ret;
    }
};
